#include <IO/VideoTextMode.h>
#include <Utility/CLib.h>
/*
@brief 格式化打印
@param lpcsFmt 格式化字符串
@nColor 字符颜色
@... 可变参数
@return 打印的字符数
@note 目前支持 %d %u %x %c %s
@note 由于需要接收可变参数个数，因此采用 C 调用约定
*/
int VideoTextModePrintFormatted(LPCSTR lpcsFmt, ...)
{
    int ret = 0;
    LPINT lpParamBase = (LPINT)&lpcsFmt + 1; /* 首个参数地址 */
    DWORD dwIndex = 0u; /* 第几个参数 */
    BOOL bParseFlag = FALSE;
    while (*lpcsFmt)
    {
        if (!bParseFlag) /* 当前字符不解析 */
        {
            if (*lpcsFmt == '%') /* 下个字符解析 */
            {
                bParseFlag = TRUE; /* 下个字符解析 */
            }
            else /* 正常字符 */
            {
                VideoTextModePutChar(*lpcsFmt); /* 打印字符 */
                ret++;
            }
            lpcsFmt++; /* 下个字符 */
        }
        else /* 当前字符解析 */
        {            
            bParseFlag = FALSE; /* 下个字符不解析  */
            if (*lpcsFmt == 'd') /* 整数 */
            {
                char buf[33];
                ret += VideoTextModePutString(itoa(*(int*)(lpParamBase + dwIndex), buf, 10)) - 1;
                dwIndex++;
            }
            else if (*lpcsFmt == 'u') /* 无符号整数 */
            {
                char buf[33];
                ret += VideoTextModePutString(utoa(*(unsigned int*)(lpParamBase + dwIndex), buf, 10)) - 1;
                dwIndex++;
            }
            else if (*lpcsFmt == 'x') /* 十六进制 */
            {
                char buf[9];
                ret += VideoTextModePutString(itoa(*(int*)(lpParamBase + dwIndex), buf, 16)) - 1;
                dwIndex++;
            }
            else if (*lpcsFmt == 'c') /* 字符，传参时字符提升为 4 字节 */
            {
                VideoTextModePutChar(*(int*)(lpParamBase + dwIndex));
                ret++;  /* 一个字符 */
                dwIndex++;
            }
            else if (*lpcsFmt == 's') /* 字符串 */
            {
                LPCSTR lpcs = (LPCSTR)*(lpParamBase + dwIndex); /* 指向字符串的指针 */
                ret += VideoTextModePutString(lpcs) - 1;
                dwIndex++;
            }
            else if (*lpcsFmt == '%') /* 转义 */
            {
                VideoTextModePutChar('%');
                ret++;
            }
            lpcsFmt++;
        }
    }
    return ret;
}
